﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using H2.Streams;
using H2.Streams.Sections;

namespace Mystery
{
    public partial class DataShifter //Raw
    {
        public static void ShiftUnicodeTables(MapStream map, int shiftSize)
        {
            map.Unicode.English.StringIndexOffset += shiftSize;
            map.Unicode.English.StringTableOffset += shiftSize;
            map.Unicode.Chinese.StringIndexOffset += shiftSize;
            map.Unicode.Chinese.StringTableOffset += shiftSize;
            map.Unicode.Dutch.StringIndexOffset += shiftSize;
            map.Unicode.Dutch.StringTableOffset += shiftSize;
            map.Unicode.French.StringIndexOffset += shiftSize;
            map.Unicode.French.StringTableOffset += shiftSize;
            map.Unicode.Italian.StringIndexOffset += shiftSize;
            map.Unicode.Italian.StringTableOffset += shiftSize;
            map.Unicode.Japanese.StringIndexOffset += shiftSize;
            map.Unicode.Japanese.StringTableOffset += shiftSize;
            map.Unicode.Korean.StringIndexOffset += shiftSize;
            map.Unicode.Korean.StringTableOffset += shiftSize;
            map.Unicode.Portuguese.StringIndexOffset += shiftSize;
            map.Unicode.Portuguese.StringTableOffset += shiftSize;
            map.Unicode.Spanish.StringIndexOffset += shiftSize;
            map.Unicode.Spanish.StringTableOffset += shiftSize;
            map.Header.StrangeFileStringsOffset += shiftSize;
        }

        public static void ShiftBitmapTable(MapStream map, int shiftSize)
        {
            TagInfo[] tagInfos = map.Tags.GetTagInfoArrayOfClass("bitm");
            for (int i = 0; i < tagInfos.Length; i++)
            {
                map.Position = tagInfos[i].Offset;
                ShiftBitmap(map, shiftSize);
            }
        }

        private static void ShiftBitmap(MapStream map, int shiftSize)
        {
            map.Position += 68;

            int chunkCount = map.ReadReflexive();
            int startOffset = (int)map.Position;
            for (int i = 0; i < chunkCount; i++)
            {
                map.Position = startOffset + (116 * i) + 28;

                int LOD1Offset = map.ReadInt32();
                if (LOD1Offset == -1) break;
                else if (((long)LOD1Offset & 0XC0000000) == 0) //If is Internal
                {
                    int LOD2Offset = map.ReadInt32();
                    int LOD3Offset = map.ReadInt32();

                    map.Position -= 24;
                    map.Write(LOD1Offset + shiftSize);
                    if (LOD2Offset != -1) map.Write(LOD2Offset + shiftSize);
                    else map.Position += 4;
                    if (LOD3Offset != -1) map.Write(LOD3Offset + shiftSize);
                }
            }
        }
    }
}
